﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using Sorteo.BusinessComponents;
using Sorteo.BusinessEntities;
using Sorteo.UI.Reports;

namespace Sorteo.UI
{
    public partial class PrincipalForm : BaseForm
    {
        #region Constructors

        public PrincipalForm()
        {
            InitializeComponent();
            ConfigureCulture();
        }

        #endregion

        #region Declarations

        private const string ReporteConcursantes = "Sorteo.UI.Reports.Concursantes.rdlc";

        #endregion

        #region Event Handlers

        private void PrincipalForm_Load(object sender, EventArgs e)
        {
            Nuevo();
        }

        private void nuevoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Nuevo();
        }

        private void promocionesComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadSorteos();
        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void promocionesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            new PromocionesForm().ShowDialog();
            LoadPromociones();
        }

        private void cargaDeConcursantesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            new CargarConcursantesForm().ShowDialog();
        }

        private void favorecidosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            new ReportePromocionesForm().ShowDialog();
        }

        private void cleanupToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (ShowQuestion("Está seguro de borrar todos los datos de acciones y participantes?\r\nLa información de promociones no será eliminada"))
                {
                    Cursor = Cursors.WaitCursor;
                    BCPromocion.Cleanup();
                    ShowConfirmation("Los datos fueron borrados satisfactoriamente");
                }
            }
            finally
            {
                Cursor = Cursors.Arrow;
            }
            
        }

        private void sorteoButton_Click(object sender, EventArgs e)
        {
            try
            {
                Cursor = Cursors.WaitCursor;
                sorteoButton.Enabled = false;
                List<BEGanador> ganadores = null;
                if (promocionTabPage.Visible)
                {
                    var sorteoId = 0;
                    if (sorteoActualTextBox.Tag != null)
                        sorteoId = (int)sorteoActualTextBox.Tag;
                    ganadores = BCPromocion.EjecutaSorteo(sorteoId);
                }
                else if (fechasTabPage.Visible)
                {
                    if (ValidateInput())
                        ganadores = BCPromocion.EjecutaSorteo(desdeDateTime.Value, hastaDateTime.Value, int.Parse(numGanadoresTextBox.Text), favorecerMultiplesVecesCheckBox.Checked);
                    else
                        return;
                    
                }
                LoadGrid(ganadores);
                Cursor = Cursors.Arrow;
                ShowConfirmation("El sorteo finalizó satisfactoriamente");
            }
            catch (Exception ex)
            {
                ShowError("Se presentó un error al ejecutar el sorteo.\r\nVerifique que la promoción tenga concursantes asociados e intente de nuevo\r\n\r\nDetalles: " + ex.Message);
            }
            finally
            {
                Cursor = Cursors.Arrow;
            }
        }

        private void concursantesPorPromociónToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                var paramForm = new ConcursantesForm();
                if (paramForm.ShowDialog() == DialogResult.OK)
                {
                    var filtro = "";
                    if (paramForm.Option == FilterOption.Todos)
                        filtro = "Todos";
                    else if (paramForm.Option == FilterOption.SoloFavorecidos)
                        filtro = "Solo favorecidos";
                    else
                    {
                        if (!string.IsNullOrEmpty(paramForm.FiltroCedula.Trim()))
                            filtro = "Con cédula igual a '" + paramForm.FiltroCedula.Trim() + "'";
                        if (!string.IsNullOrEmpty(paramForm.FiltroNombre.Trim()))
                        {
                            filtro += string.IsNullOrEmpty(filtro) ? "" : "\r\n";
                            filtro += "Nombre contiene '" + paramForm.FiltroNombre.Trim() + "'";
                        }
                    }
                    Cursor = Cursors.WaitCursor;
                    var parameters = new List<ReportParameter> { new ReportParameter("Concursantes", filtro) };
                    var data = BCPromocion.GetConcursantesReport(paramForm.Promocion, (paramForm.Option == FilterOption.SoloFavorecidos), paramForm.FiltroCedula, paramForm.FiltroNombre);
                    PrintReport(ReporteConcursantes, "Reporte OT Detallado", data, parameters);
                }
            }
            finally
            {
                Cursor = Cursors.Arrow;
            }
        }

        #endregion

        #region Methods: Non-Public

        private static void PrintReport(string name, string title, object data, IEnumerable<ReportParameter> parameters)
        {
            var report = new ReportViewerForm { ReportTitle = title };
            report.BuildReport(data, name, parameters);
            report.Show();
        }

        private bool ValidateInput()
        {
            if (fechasTabPage.Visible)
            {
                var numGanadores = numGanadoresTextBox.Text;
                var inicio = desdeDateTime.Value;
                var final = hastaDateTime.Value;

                int dummyInt;

                if (string.IsNullOrEmpty(numGanadores) || !int.TryParse(numGanadores, out dummyInt))
                {
                    ShowError("La cantidad de ganadores debe ser mayor a cero");
                    numGanadoresTextBox.Focus();
                    return false;
                }
                if (inicio.Date > final.Date)
                {
                    ShowError("La fecha final debe ser mayor o igual a la fecha de inicio");
                    desdeDateTime.Focus();
                    return false;
                }
            }
            return true;
        }
        
        private void Nuevo()
        {
            LoadPromociones();
            ganadoresGrid.DataSource = null;
            ConfiguraGrid();
        }

        private void LoadGrid(IEnumerable<BEGanador> list)
        {
            ganadoresGrid.DataSource = list;
            ConfiguraGrid();
        }

        private void ConfiguraGrid()
        {
            if (ganadoresGrid.RowCount == 0)
                ganadoresGrid.DataSource = new List<BEGanador>();

            var colCedula = ganadoresGrid.Columns["Cedula"];
            var colTelefono = ganadoresGrid.Columns["Telefono"];
            var colNombre = ganadoresGrid.Columns["Nombre"];
            var colAccion = ganadoresGrid.Columns["Accion"];
            var colEmpresa = ganadoresGrid.Columns["Empresa"];

            if (colCedula == null || colTelefono == null || colNombre == null ||
                colAccion == null || colEmpresa == null)
                return;
            
            colCedula.Width = 80;
            colCedula.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
            
            colTelefono.Width = 80;
            colTelefono.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

            colAccion.Width = 50;
            colAccion.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

            colEmpresa.Width = 100;
            colEmpresa.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
            
            colNombre.Width = 100;
            colNombre.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }

        private void LoadPromociones()
        {
            var list = BCPromocion.GetActiveList();
            promocionesComboBox.DataSource = list;
            promocionesComboBox.ValueMember = "Id";
            promocionesComboBox.DisplayMember = "Nombre";
        }

        private void LoadSorteos()
        {
            var selected = promocionesComboBox.SelectedItem as BEPromocion;
            if (selected != null)
            {
                var sorteos = selected.Sorteos;
                var current = (from s in sorteos orderby s.Orden where !s.Ejecutado select s).FirstOrDefault();
                if (current == null)
                {
                    ShowError("Todos los sorteos de la promoción seleccionada ya fueron ejecutados");
                    sorteoButton.Enabled = false;
                }
                else
                {
                    sorteoActualTextBox.Text = current.Orden.ToString();
                    sorteoTotalTextBox.Text = sorteos.Count().ToString();
                    sorteoActualTextBox.Tag = current.Id;
                    sorteoButton.Enabled = true;
                }
            }
        }

        private static void ConfigureCulture()
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
        }
        
        #endregion              
    }
}